//dfs函数 主席树区间修改应用代码
#include<bits/stdc++.h>
using namespace std;

const int N = 100010, M = N * 2;

int n, m;
int w[N], h[N], e[M], ne[M], idxs;
int id[N], nw[N], cnt;
int dep[N], sz[N], top[N], fa[N], son[N];
int u,v,k,last;

struct Node
{
    int l,r;
    int cnt;
}tr[N*4+N*17];
int root[N],idx;

vector<int> nums;
int find(int x)
{
    return lower_bound(nums.begin(),nums.end(),x)-nums.begin();
}

void add(int a, int b)
{
    e[idxs] = b, ne[idxs] = h[a], h[a] = idxs ++ ;
}

void dfs1(int u, int father, int depth)//求出各点父节点、深度、重儿子、子树大小
{
    dep[u] = depth, fa[u] = father, sz[u] = 1;
    for (int i = h[u]; ~i; i = ne[i])
    {
        int j = e[i];
        if (j == father) continue;
        dfs1(j, u, depth + 1);
        sz[u] += sz[j];
        if (sz[son[u]] < sz[j]) son[u] = j;
    }
}

//当前点的权值存入数组nw中该点时间戳位置，最后按时间戳遍历即为dfs序
void dfs2(int u, int t)//求出各点的时间戳、dfs序、所在重链的“头”
{
    id[u] = ++ cnt, nw[cnt] = w[u], top[u] = t;
    if (!son[u]) return;//没有儿子则也没有重儿子
    dfs2(son[u], t);//往重儿子走，其“头”还是t
    for (int i = h[u]; ~i; i = ne[i])
    {
        int j = e[i];
        if (j == fa[u] || j == son[u]) continue;//邻接点为父亲以及重儿子的情况
        dfs2(j, j);
    }
}

int LCA(int x,int y){
    while(top[x]!=top[y])
    dep[top[x]]>=dep[top[y]]?x=fa[top[x]]:y=fa[top[y]];
    return dep[x]>=dep[y]?y:x;
}

int build(int l,int r)
{
    int p=++idx;
    if(l==r) return p;
    int mid=l+r>>1;
    tr[p].l=build(l,mid),tr[p].r=build(mid+1,r);
    return p;
}

int insert(int p,int l,int r,int x)
{
    int q=++idx;
    tr[q]=tr[p];
    if(l==r)
    {
        tr[q].cnt++;
        return q;
    }
    int mid=l+r>>1;
    if(x<=mid) tr[q].l=insert(tr[p].l,l,mid,x);
    else tr[q].r=insert(tr[p].r,mid+1,r,x);
    tr[q].cnt=tr[tr[q].l].cnt+tr[tr[q].r].cnt;
    return q;
}

int query(int a,int b,int c,int d,int l,int r,int k)
{
    if(l==r) return r;
    int cnt=tr[tr[a].l].cnt+tr[tr[b].l].cnt-tr[tr[c].l].cnt-tr[tr[d].l].cnt;
    int mid=l+r>>1;
    if(k<=cnt) return query(tr[a].l,tr[b].l,tr[c].l,tr[d].l,l,mid,k);
    else return query(tr[a].r,tr[b].r,tr[c].r,tr[d].r,mid+1,r,k-cnt);
}

//ps:对于树形结构而言，需要dfs来以某节点为上一个版本，子节点为新版本
void dfs(int u,int fa)
{
    root[u]=insert(root[fa],0,nums.size()-1,find(w[u]));
    for(int i=h[u];i!=-1;i=ne[i])
    {
        int j=e[i];
        if(j==fa) continue;
        dfs(j,u);
    }
}

void dfs_d(int u,int l,int r)
{

    cout <<l<<" "<<r<<" "<<tr[u].cnt<<endl;
    if(l==r) return ;
    int mid=l+r>>1;
    dfs_d(tr[u].l,l,mid);
    dfs_d(tr[u].r,mid+1,r);
}

int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);

    memset(h,-1,sizeof(h));
    cin >>n>>m;

    for(int i=1;i<=n;i++)
    {
        cin >>w[i];
        nums.push_back(w[i]);
    }

    sort(nums.begin(),nums.end());
    nums.erase(unique(nums.begin(),nums.end()),nums.end());

    for(int i=1;i<n;i++)
    {
        int a,b;
        cin >>a>>b;
        add(a,b),add(b,a);
    }

    dfs1(1,0,1);
    dfs2(1,1);
    root[0]=build(0,nums.size()-1);
    dfs(1,0);

//    for(int i=1;i<=n;i++)
//        root[i]=insert(root[i-1],0,nums.size()-1,find(w[i]));
//    cout <<fa[1]<<endl;

//    for(int i=0;i<=n;i++)
//    {
//        cout <<i<<":"<<endl;
//        dfs_d(root[i],0,nums.size()-1);
//    }

    while(m--)
    {
        cin >>u>>v>>k;
        u=u^last;
        int lcas=LCA(u,v);
//        cout <<lcas<<endl;
//        cout <<u<<" "<<v<<" "<<"lca:"<<lcas<<endl;
//        cout <<query(u,v,lcas,fa[lcas],0,nums.size()-1,k)<<endl;

        last=nums[query(root[u],root[v],root[lcas],root[fa[lcas]],0,nums.size()-1,k)];
        cout <<last<<endl;
    }

    return 0;
}
/*
8 5
105 2 9 3 8 5 7 7
1 2
1 3
1 4
3 5
3 6
3 7
4 8
2 5 1
0 5 2
10 5 3
11 5 4
110 8 2

2
8
9
105
7
*/
